在實際開發專案的過程中通常會有很多個不同的 workflow,例如測試、建置、部署或是資料排程。但在一般情況下,我們通常只需要關注某一個特定的 workflow,例如『部署到 production』的流程之類的,但如果每次都要打開 GitHub 網頁,手動篩選那個 workflow,過程會很繁瑣。為了更精準、更高效率,我們可以利用 BOT,直接查詢 指定 workflow 的執行情況
新增程式碼
def format_workflow_runs(workflow_runs, workflow_filter=None):
"""格式化 workflow 運行資訊"""
if not workflow_runs:
return "📭 沒有找到 workflow 運行記錄"
message = "🚀 **GitHub Actions Pipeline 狀態**\n\n"
for i, run in enumerate(workflow_runs[:3]):
status_emoji = {
'completed': '✅' if run['conclusion'] == 'success' else '❌',
'in_progress': '🔄',
'queued': '⏳',
'pending': '⏳',
'action_required': '⚠️',
'cancelled': '⏹️'
}
conclusion_map = {
'success': '成功',
'failure': '失敗',
'cancelled': '已取消',
'skipped': '已跳過',
'timed_out': '超時',
None: '進行中'
}
emoji = status_emoji.get(run['status'], '❓')
conclusion = conclusion_map.get(run['conclusion'], '未知')
created_at = datetime.fromisoformat(run['created_at'].replace('Z', '+00:00'))
formatted_time = created_at.strftime("%m/%d %H:%M")
run_duration = ""
if run['status'] == 'completed' and run['updated_at']:
updated_at = datetime.fromisoformat(run['updated_at'].replace('Z', '+00:00'))
duration = updated_at - created_at
run_duration = f"⏱️ {duration.total_seconds():.0f}秒"
message += (
f"{emoji} **{run['name']}**\n"
f" 📋 狀態: {conclusion}\n"
f" 🕒 時間: {formatted_time}\n"
f" 🔢 運行ID: #{run['run_number']}\n"
f" 🎯 分支: {run['head_branch']}\n"
f" 📁 檔案: `{run['path'].split('/')[-1]}`\n"
f" {run_duration}\n"
f" 🔗 [查看詳情]({run['html_url']})\n\n"
)
return message
def get_workflow_id_by_name(workflow_name):
"""根據顯示名稱獲取 workflow ID"""
try:
headers = {
'Authorization': f'token {GH_TOKEN}',
'Accept': 'application/vnd.github.v3+json'
}
url = f'https://api.github.com/repos/{GITHUB_OWNER}/{GITHUB_REPO}/actions/workflows'
response = requests.get(url, headers=headers)
response.raise_for_status()
data = response.json()
for workflow in data.get('workflows', []):
if workflow['name'].lower() == workflow_name.lower():
return workflow['id']
return None
except:
return None
返回discord看成果